package pe.com.hermes.hermetic.web.controller.general;

import pe.com.hermes.hermetic.negocio.service.HermeticFacade;
import pe.com.hermes.hermetic.negocio.ultil.Util;
import pe.com.hermes.hermetic.web.controller.base.IController;

import java.io.IOException;
import java.io.InputStream;

import java.sql.Connection;
import java.sql.SQLException;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import javax.sql.DataSource;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperReport;

import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.util.JRLoader;

import org.apache.log4j.Logger;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Component;

@Component("reporteFactory")
public class MostrarReporteController implements IController{
    private static Logger logger = Logger.getLogger("MostrarReporteController");
    private static String FALT_Y_SOBR = "HMR4005";
    private static String INGR_Y_SALI = "HMR3001";
    private static String CATEG_REPO = "4";
    private static String SUB_CATEG_ATM = "4";
    @Autowired
    private HermeticFacade servicioHermetic; 
    @Autowired
    private DataSourceTransactionManager transactionManager;
    /*
    public MostrarReporteController(HermeticFacade servicioHermetic, DataSourceTransactionManager transactionManager){
        this.servicioHermetic = servicioHermetic;
        this.transactionManager = transactionManager;
    }
    */
    public String mostraReporte(HttpServletRequest request, HttpServletResponse response,String codClie) throws Exception {
    
        HttpSession session = request.getSession(false);        
        if (session.getAttribute("usuario") == null)
            return FORM_SESSION_FINISH;
    
        try {
            //Leer y cargar el archivo jasper
            Map parameters = new HashMap();
            JasperReport jr = null;
            InputStream reportStream = null;
            //seteo de parametros
            String formulario = request.getParameter("formulario");
            String rutaJasper = session.getServletContext().getInitParameter("rutajasper");
            String reporte = request.getParameter("reporte");
            String opcion = request.getParameter("opcion");
            logger.info(formulario+","+rutaJasper+","+reporte+","+opcion);
            //Establecer los parametros
            muestraPDFS(request,response,jr,parameters,opcion, reportStream,formulario,rutaJasper,reporte,codClie);//opcion y reporte son nulos
            logger.info(formulario);
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("Error en el proceso. "+ e);
            //return mapping.findForward("errorGenerico");
            return FORM_ERROR_VIEW;
        }
        return FORM_ERROR_VIEW;        
    
    }
    
    public void muestraPDFS(HttpServletRequest request, HttpServletResponse response, JasperReport jr, Map parameters, 
                             String opcion,InputStream reportStream,String formulario, String rutaJasper, String reporte,
                            String codClie) throws JRException, 
                                                                   IOException, 
                                                                   SQLException {
                reportStream = getReportStream(formulario, rutaJasper, reporte, opcion, request);
                logger.info("LA RUTA JASPER CONSULTA SALDO ES: "+rutaJasper);
                jr = (JasperReport)JRLoader.loadObject(reportStream);                
                setParemeter(request,parameters, formulario,codClie);
                logger.info("parametros Jasper: "+parameters.toString());
                muestraPDF(response,jr,parameters); 
    }   
    
    private static InputStream getReportStream(String formulario, String rutaJasper, String reporte, String opcion, HttpServletRequest request) {
        InputStream reportStream = null;
        StringBuffer nameJasper = new StringBuffer(rutaJasper+"/"+formulario);
        if (reporte == null) {reporte = "";}
        if(opcion == null){opcion = "";}
        
        if(reporte.equals("1"))
            nameJasper.append("a").append(".jasper");
        if(reporte.equals("2"))
            nameJasper.append("b").append(".jasper");
        if(reporte.equals("3"))
            nameJasper.append("c").append(".jasper");
        if(opcion.equals("1"))
            nameJasper.append("a1").append(".jasper");
        if(opcion.equals("2"))
            nameJasper.append("a2").append(".jasper");
        if(opcion.equals("3"))
            nameJasper.append("a3").append(".jasper");
        if(opcion.equals("4"))
            nameJasper.append("a4").append(".jasper");
        if(reporte.equals("")&&opcion.equals(""))
            nameJasper.append(".jasper");
        logger.info("archivo jasper: "+nameJasper.toString());
        //reportStream = getServlet().getServletConfig().getServletContext().getResourceAsStream(nameJasper.toString());
        reportStream = request.getSession(false).getServletContext().getResourceAsStream(nameJasper.toString());
        
        return reportStream;
    }    
 
    public void setParemeter(HttpServletRequest request, Map parameters, String formulario,String codClie) {        
        String fecha_srv = servicioHermetic.getFechaHoy();        
        String hora_srv = servicioHermetic.getFecha2().substring(8, 13);
        String nomClie = (String)request.getSession(false).getAttribute("nombreCliente");
        if (formulario.equals("HMR2005")||formulario.equals("HMR2004")) {
            String cod_clie_orig = 
                (String)request.getSession().getAttribute("cliente"); //JC //(String)request.getParameter("cliente"); 
            String cod_sucu_htb = request.getParameter("sucursal");
            String fec_soli_pedi = request.getParameter("fecha");
            String hor_soli_pedi = request.getParameter("hora");
            parameters.put("cod_clie_orig", cod_clie_orig);
            parameters.put("cod_sucu_htb", cod_sucu_htb);
            parameters.put("fec_soli_pedi", (fec_soli_pedi));
            parameters.put("hor_soli_pedi", hor_soli_pedi);
        }
        if (formulario.equals("HMR2006") || 
            formulario.equals("HMR20061") || 
            formulario.equals("HMR20062") || 
            formulario.equals("HMR20063") || 
            formulario.equals("HMR2006A") || 
            formulario.equals("HMR20062A")) {
            //String cod_clie = (String)request.getParameter("s_cod_clie");
            String cod_clie = (String)request.getSession().getAttribute("cliente");
            String fec_gen_arch1 = request.getParameter("lv_hoy");
            String fec_gen_arch2 = request.getParameter("lv_man");
            String hor_gen_arch = request.getParameter("lv_fec_hoy");            
            parameters.put("cod_clie", cod_clie);
            parameters.put("fec_carg_abon1", (fec_gen_arch1));
            parameters.put("fec_carg_abon2", (fec_gen_arch2));
            parameters.put("fec_impr_abon", hor_gen_arch);
        }
        
        if (formulario.equals("HMR2007")) {            
            String cod_clie = (String)request.getSession().getAttribute("cliente");
            String fec_gen_arch1 = (String)request.getAttribute("lv_hoy");
            String fec_gen_arch2 = (String)request.getAttribute("lv_man");
            String hor_gen_arch = (String)request.getAttribute("lv_fec_hoy");            
            parameters.put("cod_clie", cod_clie);
            parameters.put("fec_carg_abon1", (fec_gen_arch1));
            parameters.put("fec_carg_abon2", (fec_gen_arch2));
            parameters.put("fec_impr_abon", hor_gen_arch);
        }        


        if (formulario.equals("HMR2006r9")) {
            String cod = request.getParameter("cod");
            parameters.put("cod", cod);
        }

        if (formulario.equals("HMR3007")) {
            String cod_clie = 
                (String)request.getSession().getAttribute("cliente"); //JC //(String)request.getParameter("cliente");
            String cod_sucu_htb = 
            (String)request.getSession().getAttribute("sucursal");
            String fecdesde = request.getParameter("fechadesde");
            String fechasta = request.getParameter("fechahasta");
            String tipo_destino = 
                request.getParameter("tipoDestino");
            if(tipo_destino==null)
                tipo_destino="3";
            parameters.put("cod_clie_orig", cod_clie);
            parameters.put("cod_sucu_htb", cod_sucu_htb);
            parameters.put("fec_soli_pedi1", (fecdesde));
            parameters.put("fec_soli_pedi2", (fechasta));
            parameters.put("tip_destino", (tipo_destino));
        }

        if (formulario.equals("HMR4001")) {
            String cod_clie = 
                (String)request.getSession().getAttribute("cliente"); //JC //request.getParameter("cliente");
            String cod_cnta = request.getParameter("cuenta");
            String cod_bove = request.getParameter("modulo");
            String fechadesde = request.getParameter("fechadesde");
            String fechahasta = request.getParameter("fechahasta");
            String cod_sucu_htb = request.getParameter("sucursal");
            String tip_orig = request.getParameter("ingreso");
            String tiposele = request.getParameter("tiposele");
            if (tiposele.equals("2"))
                parameters.put("cod_punto", request.getParameter("punto"));
            else
                parameters.put("cod_punto", "0");
            if (request.getParameter("billetaje").equals("2"))
                if (request.getParameter("ingreso").equals("2"))
                    tip_orig = "3";
            String tip_remi = request.getParameter("remitente");
            String billetaje = request.getParameter("billetaje");
            parameters.put("cod_clie", cod_clie);
            parameters.put("cod_cnta", cod_cnta);
            parameters.put("cod_bove", cod_bove);
            parameters.put("fechadesde", (fechadesde));
            parameters.put("fechahasta", (fechahasta));
            parameters.put("cod_sucu_htb", cod_sucu_htb);
            parameters.put("tip_orig", tip_orig);
            parameters.put("tip_remi", tip_remi);
            parameters.put("billetaje", billetaje);
        }
        if (formulario.equals("HMR4002")) {
            String codSucuHtb = (String)request.getSession().getAttribute("sucursal");
            //String cod_cnta = request.getParameter("cuenta");
            //String cod_bove = request.getParameter("modulo");
            String codCuentas = Util.arrayToString((String[])request.getSession(false).getAttribute("chksCuenta"),",");
            String codModulos = Util.arrayToString((String[])request.getSession(false).getAttribute("chksModulo"),",");
            List listDescCnta = servicioHermetic.getDescCuentaMulti(codSucuHtb, codClie, codCuentas);
            List listDescBove = servicioHermetic.getDescModuloMulti(codSucuHtb, codClie, codModulos);
            String descCnta = Util.listToString(listDescCnta," / ");
            String descBove = Util.listToString(listDescBove," / ");
            String fecdesde = request.getParameter("fechadesde");
            String fechasta = request.getParameter("fechahasta");
            String cod_sucu_htb = request.getParameter("sucursal");
            System.out.println(fecdesde + "dsa" + fechasta);
            parameters.put("cod_clie", codClie);
            parameters.put("cod_cnta", codCuentas);
            parameters.put("cod_bove", codModulos);
            parameters.put("descCnta", descCnta);
            parameters.put("descBove", descBove);            
            parameters.put("fecdesde", (fecdesde));
            parameters.put("fechasta", (fechasta));     
            parameters.put("cod_sucu_htb", cod_sucu_htb);
        }
        if (formulario.equals("HMR4005") || 
            formulario.equals("HMR3001") || 
            formulario.equals("HMR3002") || 
            formulario.equals("HMR3003")) {
            String codCuentas,codModulos,descCnta,descBove;
            List listDescCnta = new ArrayList();
            List listDescBove = new ArrayList();
            String codSucuHtb = (String)request.getSession().getAttribute("sucursal");
            // Cuenta y Modulo Multiple
            if(FALT_Y_SOBR.equals(formulario)||INGR_Y_SALI.equals(formulario)){
                codCuentas = request.getParameter("cuenta");
                codModulos = request.getParameter("modulo");
                descCnta = "";
                descBove = "";
            }else{
                codCuentas = Util.arrayToString((String[])request.getSession(false).getAttribute("chksCuenta"),",");
                codModulos = Util.arrayToString((String[])request.getSession(false).getAttribute("chksModulo"),",");
                listDescCnta = servicioHermetic.getDescCuentaMulti(codSucuHtb, codClie, codCuentas);
                listDescBove = servicioHermetic.getDescModuloMulti(codSucuHtb, codClie, codModulos);
                descCnta = Util.listToString(listDescCnta," / ");
                descBove = Util.listToString(listDescBove," / ");
            }
            //String cod_cnta = request.getParameter("cuenta");
            //String cod_bove = request.getParameter("modulo");
            String fecdesde = request.getParameter("fechadesde");
            String fechasta = request.getParameter("fechahasta");
            String cod_sucu = request.getParameter("sucursal");
            if (formulario.equals("HMR4005")) {
                parameters.put("fec_proc_aper1", (fecdesde));
                if (fechasta != null) {
                    parameters.put("fec_proc_aper2", (fechasta));
                }
            } else {
                parameters.put("fec_proc_aper1", (fecdesde));
                if (fechasta != null) {
                    parameters.put("fec_proc_aper2", (fechasta));
                }
            }
            parameters.put("cod_sucu_htb_cnta", cod_sucu);
            parameters.put("cod_cnta", codCuentas);
            parameters.put("cod_clie_cnta", codClie);
            parameters.put("cod_bove", codModulos);
            parameters.put("descCnta", descCnta);
            parameters.put("descBove", descBove);            
        }
        if (formulario.equals("HMR4009")) {
            String cod_clie = (String)request.getSession().getAttribute("cod_cliente");
            request.getSession().setAttribute("codCliente",null);
            String cod_clie_cnta = 
                (String)request.getSession().getAttribute("cliente"); //JC //request.getParameter("cliente");
            String cod_sucu_htb_cnta = 
                request.getParameter("sucursal");
            String fecdesde = request.getParameter("fechadesde");
            String fechasta = request.getParameter("fechahasta");
            parameters.put("cod_clie", cod_clie);
            parameters.put("cod_clie_cnta", cod_clie_cnta);
            parameters.put("cod_sucu_htb_cnta", cod_sucu_htb_cnta);
            parameters.put("fec_proc_aper1", (fecdesde));
            parameters.put("fec_proc_aper2", (fechasta));

        }
        if (formulario.equals("HMR4013")) {
            String num_carg_ingr = 
            (String)request.getSession().getAttribute("cliente");
            String fecdesde = 
                request.getParameter("fechadesde");
            String fechasta = 
                request.getParameter("fechahasta");
            System.out.println(num_carg_ingr + fecdesde + fechasta);
            parameters.put("cod_clie", num_carg_ingr);
            parameters.put("fec_proc_aper1", (fecdesde));
            parameters.put("fec_proc_aper2", (fechasta));

        }
        if (formulario.equals("HMR40131")) {
            String num_carg_ingr = 
            (String)request.getSession().getAttribute("cliente");
            String fecdesde = 
                request.getParameter("fechadesde");
            String fechasta = 
                request.getParameter("fechahasta");
            String cod_sucu_htb = (String)request.getSession().getAttribute("sucursal");
            String user = 
                (String)request.getSession().getAttribute("usuario");
            servicioHermetic.actualizaConsistencia(user, num_carg_ingr);
            parameters.put("cod_clie", num_carg_ingr);
            parameters.put("fec_proc_aper1", (fecdesde));
            parameters.put("fec_proc_aper2", (fechasta));
            parameters.put("cod_sucu_htb_cnta", cod_sucu_htb);
        }
        if (formulario.equals("HMR4008L")||formulario.equals("HMR4004")) {
            String cod_clie = 
                (String)request.getSession().getAttribute("cliente"); //JC //request.getParameter("cliente");
            String fec_orig1 = request.getParameter("fechadesde");
            String fec_orig2 = request.getParameter("fechahasta");
            String cod_sucu_htb = (String)request.getSession().getAttribute("sucursal");
            String cod_punt_orig = 
                request.getParameter("codPunto");
            parameters.put("cod_clie", cod_clie);
            parameters.put("fec_orig1", fec_orig1);
            parameters.put("fec_orig2", fec_orig2);
            parameters.put("cod_sucu_htb", cod_sucu_htb);
            parameters.put("cod_punt_orig", cod_punt_orig);
        }
        if (formulario.equals("HMR4015")) {
            String num_carg_ingr = request.getParameter("cargo");
            String fecdesde = request.getParameter("fechadesde");
            String fechasta = request.getParameter("fechahasta");
            String cod_sucu_htb = request.getParameter("sucursal");
            String cod_clie = 
                (String)request.getSession().getAttribute("cliente"); //JC //(String)request.getParameter("cliente");
            parameters.put("num_carg_ingr", num_carg_ingr);
            parameters.put("fechadesde", (fecdesde));
            parameters.put("fechahasta", (fechasta));
            parameters.put("cod_sucu_htb_cnta", cod_sucu_htb);
            parameters.put("cod_clie", cod_clie);
        }
        if (formulario.equals("HMR4010")) {

            String codSucuHtb = (String)request.getSession().getAttribute("sucursal"); 
            String fecdesde = request.getParameter("fechadesde");
            String fechasta = request.getParameter("fechahasta");
            
            String codCuentas = Util.arrayToString((String[])request.getSession(false).getAttribute("chksCuenta"),",");
            String codModulos = Util.arrayToString((String[])request.getSession(false).getAttribute("chksModulo"),",");
            String descCnta = null;
            String descBove = null;
            boolean isAtmActive = servicioHermetic.getParamActive(codClie,codSucuHtb,CATEG_REPO,SUB_CATEG_ATM);
            
            /*Verificar si la llamada es desde el HWF3002
             * Solo si es distinto de HWF3002, hay que desconcatenar
             * */
            String fromHWF3002=(String)request.getSession(false).getAttribute("fromHWF3002");
            if (fromHWF3002==null || !fromHWF3002.equals("true")){
                //Hay que desconcatenar cuentas y bovedas
                String cuentasSinConcat="";
                String modulosSinConcat="";
                
                String[] cntasStringArray=codCuentas.split(",");
                for (int i=0;i<cntasStringArray.length;i++){
                    String c=cntasStringArray[i];
                    if (c!=null && c.length()>0){
                        String[] listCtaSucuClie=c.split("-");
                        if (listCtaSucuClie!=null && listCtaSucuClie.length==3)
                          cuentasSinConcat+=listCtaSucuClie[0]+",";
                    }
                }
                if (cuentasSinConcat.length()>1){
                  cuentasSinConcat=cuentasSinConcat.substring(0,cuentasSinConcat.length()-1);                
                }
                
                String[] bovesStringArray=codModulos.split(",");
                for (int i=0;i<bovesStringArray.length;i++){
                    String c=bovesStringArray[i];
                    if (c!=null && c.length()>0){
                        String[] listSucuBove=c.split("-");
                        if (listSucuBove!=null && listSucuBove.length==2)
                          modulosSinConcat+=listSucuBove[1]+",";
                    }
                }                
                if (modulosSinConcat.length()>1){
                    modulosSinConcat=modulosSinConcat.substring(0,modulosSinConcat.length()-1);                
                }
                
                codCuentas=cuentasSinConcat;
                codModulos=modulosSinConcat;
                
            }
            else {
                request.getSession(false).removeAttribute("fromHWF3002");
                fechasta = request.getParameter("fechadesde");
            }


            if (codCuentas!=null && codCuentas.length() > 0 && codModulos!=null && codModulos.length() > 0){
                List listDescCnta = servicioHermetic.getDescCuentaMulti(codSucuHtb, codClie, codCuentas);
                List listDescBove = servicioHermetic.getDescModuloMulti(codSucuHtb, codClie, codModulos);
                descCnta = Util.listToString(listDescCnta," / ");
                descBove = Util.listToString(listDescBove," / ");
            }
            
            
            parameters.put("cod_clie", codClie);
            parameters.put("cod_cnta", codCuentas);
            parameters.put("cod_bove", codModulos);
            parameters.put("fec_proc_aper", (fecdesde));
            parameters.put("fec_proc_aper2", (fechasta));
            parameters.put("cod_sucu_htb", codSucuHtb);
            parameters.put("descCnta", descCnta);
            parameters.put("descBove", descBove);
            parameters.put("nomClie", nomClie);
            parameters.put("isAtmActive",isAtmActive);
            //}
            //}
        }
        if (formulario.equals("HMR9999")) {
            String codigo = request.getParameter("codigo");
            parameters.put("codigo", codigo);
        }
        parameters.put("fecha_srv",fecha_srv);
        parameters.put("hora_srv",hora_srv);
        parameters.put("contextPath",request.getSession().getServletContext().getRealPath("/"));
    }
 
    public void muestraPDF(HttpServletResponse response, JasperReport jr, Map parameters 
                            ) throws JRException, IOException, 
                                                    SQLException {        
        DataSource ds = transactionManager.getDataSource();
        Connection conn = ds.getConnection();
        try{            
            if (conn != null) {
            byte[] bytes = null;
            //Ejecutar el reporte como PDF
            bytes = JasperRunManager.runReportToPdf(jr, parameters, conn);
            response.setHeader("Cache-Control","cache"); // HTTP 1.1
            response.setHeader("Pragma","cache"); // HTTP 1.0
            response.setDateHeader ("Expires", -1);         
            //Fijar los parametros de la respuesta 
            response.setContentType("application/pdf");
            //response.addHeader("Content-Disposition", "inline; filename=Reporte.pdf");        
            response.setContentLength(bytes.length);
            ServletOutputStream servletOutputStream = response.getOutputStream();
            servletOutputStream.write(bytes, 0, bytes.length);
            //conn.close();
            servletOutputStream.flush();
            servletOutputStream.close();
            }
        }catch(Exception e){
            e.printStackTrace();
            logger.error(e);
        }finally{
            try{
                if (conn!=null){ conn.close(); }        
            }catch(Exception e){
                e.printStackTrace();
            }
        }
        
    }
}
